#include "xsUtils.hpp"

namespace xs
{

//=================================================================================================
// get_key_code
//=========

#define keycode(what) if(name==#what) return xs::##what

xs::Key get_key_code(const std::string &name)
{
	keycode(KEY_LBUTTON);
	keycode(KEY_RBUTTON);
	keycode(KEY_CANCEL);
	keycode(KEY_MBUTTON);
	keycode(KEY_XBUTTON1);
	keycode(KEY_XBUTTON2);
	keycode(KEY_BACK);
	keycode(KEY_TAB);
	keycode(KEY_CLEAR);
	keycode(KEY_RETURN);
	keycode(KEY_SHIFT);
	keycode(KEY_CONTROL);
	keycode(KEY_MENU);
	keycode(KEY_PAUSE);
	keycode(KEY_CAPITAL);
	keycode(KEY_KANA);
	keycode(KEY_HANGUEL);
	keycode(KEY_HANGUL);
	keycode(KEY_JUNJA);
	keycode(KEY_FINAL);
	keycode(KEY_HANJA);
	keycode(KEY_KANJI);
	keycode(KEY_ESCAPE);
	keycode(KEY_CONVERT);
	keycode(KEY_NONCONVERT);
	keycode(KEY_ACCEPT);
	keycode(KEY_MODECHANGE);
	keycode(KEY_SPACE);
	keycode(KEY_PRIOR);
	keycode(KEY_NEXT);
	keycode(KEY_END);
	keycode(KEY_HOME);
	keycode(KEY_LEFT);
	keycode(KEY_UP);
	keycode(KEY_RIGHT);
	keycode(KEY_DOWN);
	keycode(KEY_SELECT);
	keycode(KEY_PRINT);
	keycode(KEY_EXECUT);
	keycode(KEY_SNAPSHOT);
	keycode(KEY_INSERT);
	keycode(KEY_DELETE);
	keycode(KEY_HELP);
	keycode(KEY_KEY_0);
	keycode(KEY_KEY_1);
	keycode(KEY_KEY_2);
	keycode(KEY_KEY_3);
	keycode(KEY_KEY_4);
	keycode(KEY_KEY_5);
	keycode(KEY_KEY_6);
	keycode(KEY_KEY_7);
	keycode(KEY_KEY_8);
	keycode(KEY_KEY_9);
	keycode(KEY_KEY_A);
	keycode(KEY_KEY_B);
	keycode(KEY_KEY_C);
	keycode(KEY_KEY_D);
	keycode(KEY_KEY_E);
	keycode(KEY_KEY_F);
	keycode(KEY_KEY_G);
	keycode(KEY_KEY_H);
	keycode(KEY_KEY_I);
	keycode(KEY_KEY_J);
	keycode(KEY_KEY_K);
	keycode(KEY_KEY_L);
	keycode(KEY_KEY_M);
	keycode(KEY_KEY_N);
	keycode(KEY_KEY_O);
	keycode(KEY_KEY_P);
	keycode(KEY_KEY_Q);
	keycode(KEY_KEY_R);
	keycode(KEY_KEY_S);
	keycode(KEY_KEY_T);
	keycode(KEY_KEY_U);
	keycode(KEY_KEY_V);
	keycode(KEY_KEY_W);
	keycode(KEY_KEY_X);
	keycode(KEY_KEY_Y);
	keycode(KEY_KEY_Z);
	keycode(KEY_LWIN);
	keycode(KEY_RWIN);
	keycode(KEY_APPS);
	keycode(KEY_SLEEP);
	keycode(KEY_NUMPAD0);
	keycode(KEY_NUMPAD1);
	keycode(KEY_NUMPAD2);
	keycode(KEY_NUMPAD3);
	keycode(KEY_NUMPAD4);
	keycode(KEY_NUMPAD5);
	keycode(KEY_NUMPAD6);
	keycode(KEY_NUMPAD7);
	keycode(KEY_NUMPAD8);
	keycode(KEY_NUMPAD9);
	keycode(KEY_MULTIPLY);
	keycode(KEY_ADD);
	keycode(KEY_SEPARATOR);
	keycode(KEY_SUBTRACT);
	keycode(KEY_DECIMAL);
	keycode(KEY_DIVIDE);
	keycode(KEY_F1);
	keycode(KEY_F2);
	keycode(KEY_F3);
	keycode(KEY_F4);
	keycode(KEY_F5);
	keycode(KEY_F6);
	keycode(KEY_F7);
	keycode(KEY_F8);
	keycode(KEY_F9);
	keycode(KEY_F10);
	keycode(KEY_F11);
	keycode(KEY_F12);
	keycode(KEY_F13);
	keycode(KEY_F14);
	keycode(KEY_F15);
	keycode(KEY_F16);
	keycode(KEY_F17);
	keycode(KEY_F18);
	keycode(KEY_F19);
	keycode(KEY_F20);
	keycode(KEY_F21);
	keycode(KEY_F22);
	keycode(KEY_F23);
	keycode(KEY_F24);
	keycode(KEY_NUMLOCK);
	keycode(KEY_SCROLL);
	keycode(KEY_LSHIFT);
	keycode(KEY_RSHIFT);
	keycode(KEY_LCONTROL);
	keycode(KEY_RCONTROL);
	keycode(KEY_LMENU);
	keycode(KEY_RMENU);
	keycode(KEY_PLUS);
	keycode(KEY_COMMA);
	keycode(KEY_MINUS);
	keycode(KEY_PERIOD);
	keycode(KEY_ATTN);
	keycode(KEY_CRSEL);
	keycode(KEY_EXSEL);
	keycode(KEY_EREOF);
	keycode(KEY_PLAY);
	keycode(KEY_ZOOM);
	keycode(KEY_PA1);
	keycode(KEY_OEM_CLEAR);
	keycode(KEY_KEY_CODES_COUNT);

	LOG(LL_ERR) << "Cannot convert string \""<<name<<"\" to keycode"<<std::endl;
	return xs::KEY_KEY_CODES_COUNT;	// to nie powinno sie wykonac nigdy
}

#undef keycode

//=================================================================================================
// keycode_to_string
//=========

#define keycode(name) if(code == xs::##name) return std::string(#name)

std::string keycode_to_string(const xs::Key &code)
{
	keycode(KEY_LBUTTON);
	keycode(KEY_RBUTTON);
	keycode(KEY_CANCEL);
	keycode(KEY_MBUTTON);
	keycode(KEY_XBUTTON1);
	keycode(KEY_XBUTTON2);
	keycode(KEY_BACK);
	keycode(KEY_TAB);
	keycode(KEY_CLEAR);
	keycode(KEY_RETURN);
	keycode(KEY_SHIFT);
	keycode(KEY_CONTROL);
	keycode(KEY_MENU);
	keycode(KEY_PAUSE);
	keycode(KEY_CAPITAL);
	keycode(KEY_KANA);
	keycode(KEY_HANGUEL);
	keycode(KEY_HANGUL);
	keycode(KEY_JUNJA);
	keycode(KEY_FINAL);
	keycode(KEY_HANJA);
	keycode(KEY_KANJI);
	keycode(KEY_ESCAPE);
	keycode(KEY_CONVERT);
	keycode(KEY_NONCONVERT);
	keycode(KEY_ACCEPT);
	keycode(KEY_MODECHANGE);
	keycode(KEY_SPACE);
	keycode(KEY_PRIOR);
	keycode(KEY_NEXT);
	keycode(KEY_END);
	keycode(KEY_HOME);
	keycode(KEY_LEFT);
	keycode(KEY_UP);
	keycode(KEY_RIGHT);
	keycode(KEY_DOWN);
	keycode(KEY_SELECT);
	keycode(KEY_PRINT);
	keycode(KEY_EXECUT);
	keycode(KEY_SNAPSHOT);
	keycode(KEY_INSERT);
	keycode(KEY_DELETE);
	keycode(KEY_HELP);
	keycode(KEY_KEY_0);
	keycode(KEY_KEY_1);
	keycode(KEY_KEY_2);
	keycode(KEY_KEY_3);
	keycode(KEY_KEY_4);
	keycode(KEY_KEY_5);
	keycode(KEY_KEY_6);
	keycode(KEY_KEY_7);
	keycode(KEY_KEY_8);
	keycode(KEY_KEY_9);
	keycode(KEY_KEY_A);
	keycode(KEY_KEY_B);
	keycode(KEY_KEY_C);
	keycode(KEY_KEY_D);
	keycode(KEY_KEY_E);
	keycode(KEY_KEY_F);
	keycode(KEY_KEY_G);
	keycode(KEY_KEY_H);
	keycode(KEY_KEY_I);
	keycode(KEY_KEY_J);
	keycode(KEY_KEY_K);
	keycode(KEY_KEY_L);
	keycode(KEY_KEY_M);
	keycode(KEY_KEY_N);
	keycode(KEY_KEY_O);
	keycode(KEY_KEY_P);
	keycode(KEY_KEY_Q);
	keycode(KEY_KEY_R);
	keycode(KEY_KEY_S);
	keycode(KEY_KEY_T);
	keycode(KEY_KEY_U);
	keycode(KEY_KEY_V);
	keycode(KEY_KEY_W);
	keycode(KEY_KEY_X);
	keycode(KEY_KEY_Y);
	keycode(KEY_KEY_Z);
	keycode(KEY_LWIN);
	keycode(KEY_RWIN);
	keycode(KEY_APPS);
	keycode(KEY_SLEEP);
	keycode(KEY_NUMPAD0);
	keycode(KEY_NUMPAD1);
	keycode(KEY_NUMPAD2);
	keycode(KEY_NUMPAD3);
	keycode(KEY_NUMPAD4);
	keycode(KEY_NUMPAD5);
	keycode(KEY_NUMPAD6);
	keycode(KEY_NUMPAD7);
	keycode(KEY_NUMPAD8);
	keycode(KEY_NUMPAD9);
	keycode(KEY_MULTIPLY);
	keycode(KEY_ADD);
	keycode(KEY_SEPARATOR);
	keycode(KEY_SUBTRACT);
	keycode(KEY_DECIMAL);
	keycode(KEY_DIVIDE);
	keycode(KEY_F1);
	keycode(KEY_F2);
	keycode(KEY_F3);
	keycode(KEY_F4);
	keycode(KEY_F5);
	keycode(KEY_F6);
	keycode(KEY_F7);
	keycode(KEY_F8);
	keycode(KEY_F9);
	keycode(KEY_F10);
	keycode(KEY_F11);
	keycode(KEY_F12);
	keycode(KEY_F13);
	keycode(KEY_F14);
	keycode(KEY_F15);
	keycode(KEY_F16);
	keycode(KEY_F17);
	keycode(KEY_F18);
	keycode(KEY_F19);
	keycode(KEY_F20);
	keycode(KEY_F21);
	keycode(KEY_F22);
	keycode(KEY_F23);
	keycode(KEY_F24);
	keycode(KEY_NUMLOCK);
	keycode(KEY_SCROLL);
	keycode(KEY_LSHIFT);
	keycode(KEY_RSHIFT);
	keycode(KEY_LCONTROL);
	keycode(KEY_RCONTROL);
	keycode(KEY_LMENU);
	keycode(KEY_RMENU);
	keycode(KEY_PLUS);
	keycode(KEY_COMMA);
	keycode(KEY_MINUS);
	keycode(KEY_PERIOD);
	keycode(KEY_ATTN);
	keycode(KEY_CRSEL);
	keycode(KEY_EXSEL);
	keycode(KEY_EREOF);
	keycode(KEY_PLAY);
	keycode(KEY_ZOOM);
	keycode(KEY_PA1);
	keycode(KEY_OEM_CLEAR);
	keycode(KEY_KEY_CODES_COUNT);

	LOG(LL_ERR) << "Cannot convert keycode \""<<code<<"\" to string"<<std::endl;

	return std::string("UNKNOWN");
}

#undef keycode

}